import 'dart:math';

class NumberFormatUtils {
  static String formatNumMoney(double num, int position) {
    if ((num.toString().length - num.toString().lastIndexOf(".") - 1) <
        position) {
      //小数点后有几位小数
      return num.toStringAsFixed(position)
          .substring(0, num.toString().lastIndexOf(".") + position + 1)
          .toString();
    } else {
      return num.toString()
          .substring(0, num.toString().lastIndexOf(".") + position + 1)
          .toString();
    }
  }

  /// 将文件大小 格式化
  /// [fileSize] 文件大小
  /// [position] 保留几位小数
  /// [scale] 比例 1000/1024
  /// [specified] 0-5 指定的单位 0是B 1是KB 2是mb 3是GB 4是TB 5是PB
  static String formatFileSize(fileSize,
      {position = 2, scale = 1024, specified = -1}) {
    double num = 0;

    List sizeUnit = ["B", "KB", "MB", "GB", "TB", "PB"];

    if (fileSize is String) {
      num = double.parse(fileSize);
    } else if (fileSize is int || fileSize is double) {
      num = fileSize;
    }

    //获取他的单位
    if (num > 0) {
      int unit = log(num) ~/ log(scale);

      if (specified >= 0 && specified < sizeUnit.length) {
        unit = specified;
      }

      double size = num / pow(scale, unit);

      String numStr = formatNum(num: size, position: position);

      return numStr + " " + sizeUnit[unit];
    }

    return "0 B";
  }

  ///格式化数字 如果小数后面为0则不显示小数点
  ///[num]要格式化的数字 double 类型
  /// [position] 保留几位小数 int类型
  static formatNum({required double num, required int position}) {
    String numStr = num.toString();
    int dotIndex = numStr.indexOf(".");

    ///当前数字有小数且需要小数位数小于需要的 直接返回当前数字
    if (num % 1 != 0 && (numStr.length - 1 - dotIndex < position)) {
      return numStr;
    }

    int numbs = pow(10, position).toInt();

    //模运算 取余数
    double remainder = num * numbs % numbs;

    //小数点后位数如果小于0则表示只保留整数,余数小于1不会进位防止出现200.01保留一位小数出现200.0的情况
    if (position > 0 && remainder >= 0.5) {
      return num.toStringAsFixed(position);
    }

    return num.toStringAsFixed(0);
  }
}
